<?
require_once("Mailer.php");
require_once("Ord.class.php");

class Ordine
{
	var $id_negozio;
	var $carrello;
	var $status = 'utente'; // gli stati sono utente, spedizione, pagamento, riepilogo, conferma
	
	var $id_utente;
	var $id_spedizione;
	var $id_pagamento;
	var $pag;
	var $transaction_id;
	
	var $codice_ordine;
	var $ord;
	var $messaggio;
	
	var $db;
	
	function Ordine($id_negozio, $carrello, &$db)
	{
		$this->carrello = $carrello;
		$this->id_negozio = $id_negozio;
		$this->db = &$db;
		$_SESSION[ordine][conferma_ordine] = false;		
	}
	
	function processa()
	{
		
		// SE HO APPENA CONCLUSO POSITIVAMENTE ORDINE E CERCA DI RICARICARE SBATTO IN HOME PAGE
		if($_SESSION[ordine_concluso]) { header('location:/'); return true ;}
		
		// PRENDO PARAMETRI IN INGRESSO E COSTRUISCO ORDINE
		if($_REQUEST[utente]=='registra' && $_REQUEST[cliente])
		{
			if( ! $this->registra_utente($_REQUEST[cliente]) ) $this->messaggio = __("Impossibile registrare l' utente %s", $_REQUEST[cliente][username]);
		}
		if($_REQUEST[utente]=='utente' && $_REQUEST[username] && $_REQUEST[password])
		{
			$this->set_utente($_REQUEST[username], $_REQUEST[password]);
		}
		if($_REQUEST[spedizione]=='spedizione' && $_REQUEST[id_spedizione]>0 )
		{
			$this->set_spedizione($_REQUEST[id_spedizione]);
		}
		if($_REQUEST[pagamento]=='pagamento' && $_REQUEST[id_pagamento]>0)
		{
			$this->set_pagamento($_REQUEST[id_pagamento]);
		}
		if($_REQUEST[riepilogo]=='riepilogo' )
		{
			$this->codice_ordine = $this->salva_ordine();
			$this->ord = new Ord($this->id_negozio, $this->db, $this->codice_ordine );
			if($this->ord->id > 0)
			{
				$this->get_pagamento_class($this->ord);
				// Qui in base al tipo di pagamento vado al gateway bancario oppure direttamente alla conferma
				if($this->pag->online)
				{
					header("location:".$this->pag->gatewayURL());
					exit;
				}else
				{
					// altrimenti
					$_SESSION[ordine][conferma_ordine] = true;
					// e svuoto il carrello
					$this->carrello->clear_cart();
					$_SESSION[ordine_concluso] = true;
				}
			}else
			{
				$this->messaggio = __("Ordine non salvato correttamente.");
			}
		}
		
		
		
		$pay_res = array();
		// SE TORNA DA BANCA SELLA: a=GESPAY48880&b=PAY1_TRANSACTIONRESULT=OK*P1*PAY1_SHOPTRANSACTIONID=31*P1*PAY1_BANKTRANSACTIONID=1*P1*PAY1_UICCODE=242*P1*PAY1_AMOUNT=78.00*P1*PAY1_AUTHORIZATIONCODE=844362*P1*PAY1_ERRORCODE=0*P1*PAY1_ERRORDESCRIPTION=Transazione correttamente effettuata*P1*PAY1_OTP=ZNZkwdpKZBbRLjFuUEbOJFr8E7EO1aEl*P1*PAY1_CHEMAIL=benigni.alberto@gmail.com*P1*PAY1_CHNAME=Benigni Alberto
		if(strpos($_REQUEST[b],"PAY1_SHOPTRANSACTIONID")!==false)
		{
			$pag = new PagamentoBancaSella;
			$pay_res  = $pag->get_esito_transazione();
		}
		// ALTRI GATEWAY BANCARI VANNO QUI
		// ...
		
		// PROCESSO IN ESITO DELLA TRANSAZIONE
		if(count($pay_res)>0)
		{
			// AGGIORNO LA TRANSAZIONE E RICAVO CODICE ORDINE
			$this->update_transaction($pay_res);
			$this->ord = new Ord($this->id_negozio, $this->db, $this->codice_ordine );
			if($pay_res[esito]=='OK' )
			{
				// poi segnalo come confermato
				$_SESSION[ordine][conferma_ordine] = true;
				
				// e svuoto il carrello
				$this->carrello->clear_cart();
				$_SESSION[ordine_concluso] = true;
			}
			elseif($pay_res[esito]=='KO' )
			{
				$query = "UPDATE moka_ecomm_$this->id_negozio.ordini SET
							status=\"annullato\"
							WHERE id='$this->codice_ordine'
							";
				if(!$this->db->query($query))exit("$query ---> ".mysql_error());
				// gestisco messaggio di errore nel pagamento, poi riapre il riepilogo per ritentare eventualmente
				$this->messaggio = __("Autorizzazione al pagamento per l'ordine n. %s non concessa, prego riprovare o contattare il negozio. <br> Codice errore: %s (%s)",$this->codice_ordine, $pay_res[err_code],$pay_res[messaggio]);
			}
		}
		
		
		/// MODIFICA DATI INSERITI IN BASE AL PARAMETRO MOD
		if($_REQUEST[mod]=='spedizione') unset($_SESSION[ordine][id_spedizione]);
		elseif($_REQUEST[mod]=='pagamento') unset($_SESSION[ordine][id_pagamento]);
		
		
		
		
		// CALCOLO LO STATUS PER DIRE ALLA VISTA QUALE TEMPLATE MOSTRARE
		if($_SESSION[cliente][id]>0)
		{
			$this->id_utente = $_SESSION[cliente][id];
			if($_SESSION[ordine][id_spedizione]>0)
			{
				$this->id_spedizione = $_SESSION[ordine][id_spedizione];
				if($_SESSION[ordine][id_pagamento]>0)
				{
					$this->id_pagamento = $_SESSION[ordine][id_pagamento];
					if($_SESSION[ordine][conferma_ordine])
					{
						$this->status = 'conferma';
						$mail = new Mailer($this->id_negozio);
						$mail->sendShopMail("conferma_ordine",$this->ord);
						// a questo punto dovrei cancellare tutti i dati in sessione riguardanti questo ordine appena concluso
						unset($_SESSION[ordine]);
					}
					else
					{
						$this->status = 'riepilogo';
					}
				}
				else
				{
					$this->status = 'pagamento';
				}
			}
			else
			{
				$this->status = 'spedizione';
			}
		}
		else 
		{
			$this->status = 'utente';
		}
		
		// AGGIORNO IL TOTALE DEL RIEPILOGO
		$_SESSION[ordine][totale] = $this->ricalcola_totale();
	}
	
	function set_utente($username, $password)
	{		
		$cliMgr = new CliManager($this->id_negozio,&$this->db);
		$cliente = $cliMgr->isCli($username,$password);
		if($cliente!==false)
		{
			$_SESSION[cliente] = $cliente;
			return true;
		}
		return false;
	}
	function registra_utente($cliente)
	{		
		$cliMgr = new CliManager($this->id_negozio,&$this->db);
		$new_cliente = $cliMgr->setCli($cliente);
		if(is_array($cliMgr->isCli($cliente[username],$cliente[password])))
		{
			$_SESSION[cliente] = $new_cliente;
			return true;	
		}
		return false;
	}
	
	function set_spedizione($id_spedizione)
	{
		$_SESSION[ordine][id_spedizione] = $id_spedizione;
		$_SESSION[ordine][sped]	= $_REQUEST[sped];
		// RICOPIO I DATI DI SPEDIZIONE PER FATTURAZIONE
		if($_SESSION[ordine][pagam][indirizzo_diverso]!='si')$_SESSION[ordine][pagam]	= $_REQUEST[sped];
		
		// ESTRAGGO IL PREZZO DELLA SPED
		$query = "SELECT prezzo FROM moka_ecomm_$this->id_negozio.metodi_spedizione WHERE id='".$id_spedizione."' ";	
		$result = $this->db->query($query);
		//echo $query;
		if(mysql_num_rows($result) > 0)
		{
			$row = mysql_fetch_object($result);	
			$_SESSION[ordine][sped][prezzo] = number_format($row->prezzo,2); 
		}
		
	}
	
	function set_pagamento($id_pagamento)
	{
		$_SESSION[ordine][id_pagamento] = $id_pagamento;		
		if($_REQUEST[pagam][indirizzo_diverso]!='si')
		{
			$_SESSION[ordine][pagam]	= $_SESSION[ordine][sped];
			$_SESSION[ordine][pagam][email] = $_REQUEST[pagam][email];
			$_SESSION[ordine][pagam][cf] 	= $_REQUEST[pagam][cf];
		}
		else $_SESSION[ordine][pagam]	= $_REQUEST[pagam];
	
		// ESTRAGGO IL PREZZO PAGAMENTO
		$query = "SELECT prezzo FROM moka_ecomm_$this->id_negozio.metodi_pagamento WHERE id='".$id_pagamento."' ";	
		$result = $this->db->query($query);
		//echo $query;
		if(mysql_num_rows($result) > 0)
		{
			$row = mysql_fetch_object($result);	
			$_SESSION[ordine][pagam][prezzo] = number_format($row->prezzo,2); 
		}
	
	}
	
	function ricalcola_totale()
	{
		//echo " ---- ".$this->carrello->get_totale()." -- ".$_SESSION[ordine][pagam][prezzo] ." -- ".$_SESSION[ordine][sped][prezzo];
		$tot = $this->carrello->get_totale()+$_SESSION[ordine][pagam][prezzo]+$_SESSION[ordine][sped][prezzo];
		return number_format($tot,2);
	}
	
	function salva_ordine()
	{
		$indirizzo_diverso = ($_REQUEST[pagam][indirizzo_diverso]=='si')?1:0;
		// eseguo tutte le operazioni di salvataggio
		$query = "INSERT INTO moka_ecomm_$this->id_negozio.ordini SET
					id_utente 		= '".$_SESSION[cliente][id]."',
					id_spedizione 	= '".$_SESSION[ordine][id_spedizione]."',
					id_pagamento 	= '".$_SESSION[ordine][id_pagamento]."',
					data_ins 		= '".time()."',
					indirizzo_diverso = $indirizzo_diverso,
					sped_nome		= '".$_SESSION[ordine][sped][nome]."',
					sped_cognome	= '".$_SESSION[ordine][sped][cognome]."',
					sped_indirizzo	= '".$_SESSION[ordine][sped][indirizzo]."',
					sped_citta		= '".$_SESSION[ordine][sped][citta]."',
					sped_cap		= '".$_SESSION[ordine][sped][cap]."',
					sped_provincia	= '".$_SESSION[ordine][sped][provincia]."',
					sped_nazione	= '".$_SESSION[ordine][sped][nazione]."',
					sped_telefono	= '".$_SESSION[ordine][sped][telefono]."',
					sped_note		= '".$_SESSION[ordine][sped][note]."',
					pagam_nome		= '".$_SESSION[ordine][pagam][nome]."',
					pagam_cognome	= '".$_SESSION[ordine][pagam][cognome]."',
					pagam_cf		= '".$_SESSION[ordine][pagam][cf]."',
					pagam_indirizzo	= '".$_SESSION[ordine][pagam][indirizzo]."',
					pagam_citta		= '".$_SESSION[ordine][pagam][citta]."',
					pagam_cap		= '".$_SESSION[ordine][pagam][cap]."',
					pagam_provincia	= '".$_SESSION[ordine][pagam][provincia]."',
					pagam_nazione	= '".$_SESSION[ordine][pagam][nazione]."',
					pagam_telefono	= '".$_SESSION[ordine][pagam][telefono]."',
					pagam_email		= '".$_SESSION[ordine][pagam][email]."',
					spese_spedizione	= '".$_SESSION[ordine][sped][prezzo]."',
					spese_pagamento		= '".$_SESSION[ordine][pagam][prezzo]."',
					spese_assicurazione	= '0',
					status 		= 'error',
					ip_cliente 		= '".$_SERVER[REMOTE_ADDR]."',
					user_agent		= '".$_SERVER[HTTP_USER_AGENT]."'
					";
		if($this->db->query($query)!== false)
		{
			$id_ordine = mysql_insert_id();
			$dati_carrello = $this->carrello->get_carrello();
			foreach($dati_carrello[prods] as $idp=>$arp)
			{
				foreach($arp->k[quantita] as $indice=>$quant)
				{
					$query = "INSERT INTO moka_ecomm_$this->id_negozio.ordini_righe SET
							id_ordine=$id_ordine,
							id_prodotto = '".$idp."',
							id_variante_1 = \"".($arp->k[id_variante_1][$indice])."\",
							valore_variante_1 = \"".($arp->k[valore_variante_1][$indice])."\",
							id_variante_2 = \"".($arp->k[id_variante_2][$indice])."\",
							valore_variante_2 = \"".($arp->k[valore_variante_2][$indice])."\",
							quantita = '".$arp->k[quantita][$indice]."',
							imponibile = '".$arp->k[imponibile][$indice]."',							
							iva = '".$arp->iva."'
						";
					if(!$this->db->query($query))exit("$query ---> ".mysql_error());
				}
			}
			
			// AGGIUNGO STATO PROCESSAMENTO
			$query = "INSERT INTO moka_ecomm_$this->id_negozio.stati_ordini SET
							id_ordine=$id_ordine,
							id_stato = '1',
							data_mod = ".time()."";
			if(!$this->db->query($query))exit("$query ---> ".mysql_error());
			$this->transaction_id = $this->db->lastInsertedId();
			
			// ORA METTO STATUS ORDINE A CONFERMATO
			$query = "UPDATE moka_ecomm_$this->id_negozio.ordini SET
							status=\"confermato\"
							WHERE id=$id_ordine
							";
			if(!$this->db->query($query))exit("$query ---> ".mysql_error());
		}else
		{
			exit("$query ---> ".mysql_error());
		}
		
		
		
		
		
		return $id_ordine;
	}
	
	function get_pagamento_class($ord)
	{
		// Preparo classe per il pagamento
		$query = "SELECT * FROM moka_ecomm_$this->id_negozio.metodi_pagamento WHERE id='".$ord->id_pagamento."' ";	
		$result = $this->db->query($query);
		//echo $query;
		if(mysql_num_rows($result) > 0)
		{
			$row = mysql_fetch_object($result);	
			$this->pag = new $row->classe; 
			if($this->pag->online)$this->pag->set_details($row->account_id, $this->transaction_id, $ord->get_totale(), "EUR");
		}
		
	}
	
	function update_transaction($pay_res)
	{
		// RICAVO COD ORDINE
		$query = "SELECT id_ordine FROM moka_ecomm_$this->id_negozio.stati_ordini 							
					WHERE id='$pay_res[id_transazione]' ";
		$result = $this->db->query($query);
		if(mysql_num_rows($result) > 0)
		{
			$row = mysql_fetch_object($result);	
			//print_r($row);
			$this->codice_ordine = $row->id_ordine;
			// AGGIORNO TRANSAZIONE
			$query = "UPDATE moka_ecomm_$this->id_negozio.stati_ordini SET
							id_stato = '$pay_res[id_stato]',
							data_mod = ".time().",
							risposta = '$pay_res[querystring]',
							authcode = '$pay_res[authcode]',
							note = '$pay_res[err_code] $pay_res[messaggio]'
							WHERE id='$pay_res[id_transazione]'
							";
			if(!$this->db->query($query))exit("$query ---> ".mysql_error());
		}	
		
		
	}
	

	
}
?>